home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
nethack.lha
/
nethack-3.1
/
src
/
allmain.c
next >
Wrap
C/C++ Source or Header
|
1993-01-24
|
9KB
|
418 lines
/* SCCS Id: @(#)allmain.c 3.1 92/11/13 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
/* various code that was replicated in *main.c */
#include "hack.h"
#ifndef NO_SIGNAL
#include <signal.h>
#endif
#ifdef OVL0
void
moveloop()
{
#ifdef MICRO
char ch;
int abort_lev;
#endif
int moverate = 0;
boolean didmove = 0;
/* Note: these initializers don't do anything except guarantee that
we're linked properly.
*/
decl_init();
monst_init();
monstr_init(); /* monster strengths */
objects_init();
#ifdef MULDGN
quest_init(); /* set up dynamic quest data */
#endif
(void) encumber_msg(); /* in case they auto-picked up something */
for(;;) {
#ifdef CLIPPING
cliparound(u.ux, u.uy);
#endif
#if defined(MAC_MPW32) && !defined(MODEL_FAR)
UnloadAllSegments(); /* Marks non-resident segments as purgeable */
#endif
get_nh_event();
didmove = flags.move;
if(flags.move) { /* actual time passed */
int wtcap;
if (u.utotype) deferred_goto();
wtcap = encumber_msg();
#ifdef SOUNDS
dosounds();
#endif
if(moverate <= 0) {
/* calculate how much time passed. */
int moveamt = 0;
if(Fast & ~INTRINSIC) moveamt = 6;
else if(Fast) moveamt = 8;
else moveamt = 12;
switch(wtcap) {
case UNENCUMBERED: break;
case SLT_ENCUMBER: moveamt = (moveamt * 4) / 3; break;
case MOD_ENCUMBER: moveamt *= 2; break;
case HVY_ENCUMBER: moveamt *= 4; break;
default: moveamt *= 12; break;
}
moverate += moveamt;
settrack();
}
if(moverate > 0) {
movemon();
/* a monster may have levteleported player -dlc */
if (u.utotype) deferred_goto();
if(!rn2(u.uevent.udemigod ? 25 :
(depth(&u.uz) >
depth(&stronghold_level))
? 50 : 70))
(void) makemon((struct permonst *)0, 0, 0);
++monstermoves;
remove_cadavers(&fobj);
remove_cadavers(&invent);
moverate -= 12;
}
if(Glib) glibr();
nh_timeout();
++moves;
if (u.ublesscnt) u.ublesscnt--;
if(flags.time) flags.botl = 1;
#ifdef POLYSELF
if (u.mtimedone && u.mh < u.mhmax) {
if (u.mh < 1) {
rehumanize();
moverate = 0;
} else if (Regeneration ||
(wtcap < MOD_ENCUMBER && !(moves%20))) {
flags.botl = 1;
u.mh++;
}
} else
#endif
if(u.uhp < u.uhpmax) {
if(u.ulevel > 9) {
int heal;
if(HRegeneration ||
(!(moves%3) &&
(wtcap < MOD_ENCUMBER || !flags.mv))) {
flags.botl = 1;
if (ACURR(A_CON) <= 12) heal = 1;
else heal = rnd((int) ACURR(A_CON)-12);
if (heal > u.ulevel-9) heal = u.ulevel-9;
u.uhp += heal;
if(u.uhp > u.uhpmax)
u.uhp = u.uhpmax;
}
} else if(HRegeneration ||
((wtcap < MOD_ENCUMBER || !flags.mv) &&
(!(moves%((MAXULEV+12)/(u.ulevel+2)+1))))) {
flags.botl = 1;
u.uhp++;
}
}
if (wtcap > MOD_ENCUMBER && flags.mv) {
if(!(wtcap < EXT_ENCUMBER ? moves%30 : moves%10)) {
if(u.uhp > 1) {
u.uhp--;
} else {
pline("You pass out from exertion!");
exercise(A_CON, FALSE);
nomul(-10);
u.usleep = 1;
}
}
}
if ((u.uen < u.uenmax) &&
((wtcap < MOD_ENCUMBER &&
(!(moves%((MAXULEV + 1 - u.ulevel) *
(pl_character[0] == 'W' ? 3 : 4) / 2))))
|| Energy_regeneration)) {
u.uen +=
rn1((int)(ACURR(A_WIS) + ACURR(A_INT)) / 10 + 1,1);
if (u.uen > u.uenmax) u.uen = u.uenmax;
flags.botl = 1;
}
if(!u.uinvulnerable) {
if(Teleportation && !rn2(85)) tele();
#ifdef POLYSELF
if(Polymorph && !rn2(100)) {
if (multi >= 0) {
if (occupation)
stop_occupation();
else
nomul(0);
}
polyself();
moverate = 0;
} else if (u.ulycn >= 0 && !rn2(80 - (20 * night()))) {
if (multi >= 0) {
if (occupation)
stop_occupation();
else
nomul(0);
}
you_were();
moverate = 0;
}
#endif
}
if(Searching && multi >= 0) (void) dosearch0(1);
do_storms();
hatch_eggs();
burn_lamps();
gethungry();
exerchk();
invault();
amulet();
if (!rn2(40+(int)(ACURR(A_DEX)*3)))
u_wipe_engr(rnd(3));
if (u.uevent.udemigod && !u.uinvulnerable) {
if (u.udg_cnt) u.udg_cnt--;
if (!u.udg_cnt) {
intervene();
u.udg_cnt = rn1(200, 50);
}
}
restore_attrib();
/* underwater and waterlevel vision are done here */
if (Is_waterlevel(&u.uz))
movebubbles();
else if (Underwater)
under_water(0);
}
if(multi < 0) {
if(!++multi){
pline(nomovemsg ? nomovemsg :
(const char *)"You can move again.");
nomovemsg = 0;
u.usleep = 0;
if(afternmv) (*afternmv)();
afternmv = 0;
}
}
find_ac();
if(!flags.mv || Blind) {
/* redo monsters if hallu or wearing a helm of telepathy */
if (Hallucination ||
(HTelepat & (WORN_HELMET|WORN_AMUL|W_ART)))
see_monsters();
/* redo objects if hallucinating */
if (Hallucination) see_objects();
/* update swallowed display */
if (Hallucination && u.uswallow) swallowed(0);
if (vision_full_recalc) vision_recalc(0); /* vision! */
}
if(flags.botl || flags.botlx) bot();
flags.move = 1;
if(multi >= 0 && occupation) {
#ifdef MICRO
abort_lev = 0;
if (kbhit()) {
if ((ch = Getchar()) == ABORT)
abort_lev++;
# ifdef REDO
else
pushch(ch);
# endif /* REDO */
}
if (!abort_lev && (*occupation)() == 0)
#else
if ((*occupation)() == 0)
#endif
occupation = 0;
if(
#ifdef MICRO
abort_lev ||
#endif
monster_nearby()) {
stop_occupation();
reset_eat();
}
#ifdef MICRO
if (!(++occtime % 7))
display_nhwindow(WIN_MAP, FALSE);
#endif
continue;
}
if((u.uhave.amulet || Clairvoyant) && !In_endgame(&u.uz) &&
!(moves%15) && !rn2(2))
do_vicinity_map();
if(u.utrap && u.utraptype == TT_LAVA) {
if(!is_lava(u.ux,u.uy))
u.utrap = 0;
else {
u.utrap -= 1<<8;
if(u.utrap < 1<<8) {
killer_format = KILLED_BY;
killer = "molten lava";
You("sink below the surface and suffocate.");
done(DROWNING); /*whatever*/
} else if(didmove && !u.umoved) {
Norep("You sink deeper into the lava.");
u.utrap += rnd(4);
}
}
}
u.umoved = FALSE;
if(!didmove || moverate <= 0) {
if(multi > 0) {
lookaround();
if(!multi) { /* lookaround may clear multi */
flags.move = 0;
continue;
}
if(flags.mv) {
if(multi < COLNO && !--multi)
flags.mv = flags.run = 0;
domove();
} else {
--multi;
rhack(save_cm);
}
} else if(multi == 0) {
#ifdef MAIL
ckmailstatus();
#endif
rhack(NULL);
}
}
if (vision_full_recalc) vision_recalc(0); /* vision! */
if(multi && multi%7 == 0)
display_nhwindow(WIN_MAP, FALSE);
}
}
#endif /* OVL0 */
#ifdef OVL1
void
stop_occupation()
{
if(occupation) {
You("stop %s.", occtxt);
occupation = 0;
/* fainting stops your occupation, there's no reason to sync.
sync_hunger();
*/
#ifdef REDO
nomul(0);
pushch(0);
#endif
}
}
#endif /* OVL1 */
#ifdef OVLB
void
display_gamewindows()
{
WIN_MESSAGE = create_nhwindow(NHW_MESSAGE);
WIN_STATUS = create_nhwindow(NHW_STATUS);
WIN_MAP = create_nhwindow(NHW_MAP);
WIN_INVEN = create_nhwindow(NHW_MENU);
#ifdef MAC
/*
* This _is_ the right place for this - maybe we will
* have to split display_gamewindows into create_gamewindows
* and show_gamewindows to get rid of this ifdef...
*/
SanePositions ( ) ;
#endif
/*
* The mac port is not DEPENDENT on the order of these
* displays, but it looks a lot better this way...
*/
display_nhwindow(WIN_STATUS, FALSE);
display_nhwindow(WIN_MESSAGE, FALSE);
display_nhwindow(WIN_MAP, FALSE);
}
void
newgame()
{
#ifdef MFLOPPY
gameDiskPrompt();
#endif
fobj = invent = migrating_objs = (struct obj *)0;
fmon = migrating_mons = (struct monst *)0;
ftrap = 0;
flags.ident = 1;
if(wiz1_level.dlevel == 0) init_dungeons();
init_objects();
u_init();
#ifndef NO_SIGNAL
(void) signal(SIGINT, (SIG_RET_TYPE) done1);
#endif
#ifdef NEWS
if(flags.news) display_file(NEWS, FALSE);
#endif
#ifdef MULDGN
load_qtlist(); /* load up the quest text info */
if(flags.legacy && moves == 1) com_pager(1);
#endif
mklev();
u_on_upstairs();
check_special_room(FALSE);
vision_reset(); /* set up internals for level (after mklev) */
flags.botlx = 1;
/* Move the monster from under you or else
* makedog() will fail when it calls makemon().
* - ucsfcgl!kneller
*/
if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy));
#ifdef CLIPPING
cliparound(u.ux, u.uy);
#endif
(void) makedog();
docrt();
#ifdef INSURANCE
save_currentstate();
#endif
return;
}
#endif /* OVLB */
/*allmain.c*/